package com.zhj.rabbitmq.demo.confirm;

import org.springframework.amqp.core.ReturnedMessage;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

/**
 * @author zhengjibin
 * @version 1.0.0
 * @ClassName RabbitmqCallback.java
 * @Description rabbitmq 回调自定义实现
 * @createTime 2023年03月25日 13:29:00
 */
@Component
public class RabbitmqCallback implements RabbitTemplate.ConfirmCallback,RabbitTemplate.ReturnsCallback {
    //将自定义回调注入到RabbitTemplate
    @Autowired
    private RabbitTemplate rabbitTemplate;

    @PostConstruct
    public void  init(){
        rabbitTemplate.setConfirmCallback(this);//注入自定义消息确认
        rabbitTemplate.setReturnsCallback(this);//注入自定义消息退回
    }
    //消息发送到 交换机，调用confirm 进行通知。只到交换机。到了交换机就会回调。但是是否能到队列这个方法不知道
    @Override
    public void confirm(CorrelationData correlationData, boolean b, String s) {
        String id = correlationData != null ? correlationData.getId() : "";
        if (b){
            System.out.println("消息发送成功-----  id:"+id);
        }else {
            System.out.println("消息发送失败-----   id:"+id+":原因是："+s);
        }
    }

    /**
     * 消息发送到了交换机，但是交换机发送到队列失败了会回调此方法。进行消息退回
     */
    @Override
    public void returnedMessage(ReturnedMessage returnedMessage) {
        byte[] body = returnedMessage.getMessage().getBody();
        System.out.println("消息发送失败，接收到回退消息："+new String(body)+"退回原因："+returnedMessage.getReplyText());
    }
}
